package service;

import common.Message;
import common.MessageType;
import utils.PrintUtil;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;

/**
 * @author 余一
 * @date 2021/10/30  10:40
 * 客户端和服务端连接的线程
 */
public class ClientConnectServerThread extends Thread{
    private Socket socket;
    private String userId;

    public ClientConnectServerThread(String userId,Socket socket){
        this.userId = userId;
        this.socket = socket;
    }

    @Override
    public void run() {
        //在通信时，客户端会不断地接收服务端返回的消息数据
        while (true){
            try {
                System.out.println("\n当前客户端线程："+userId+"，等待从服务器中读取消息...");
                ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
                Message message = (Message) objectInputStream.readObject();//如果服务器没有响应的Message，线程会阻塞
                //如果读取到的是，服务端返回的在线用户列表
                if (message.getMesType().equals(MessageType.MESSAGE_RET_ONLINE_USER)) {
                    //取出从服务端读取到的用户列表信息
                    String allUser = message.getContent();
                    String[] users = allUser.split("-");
                    System.out.println("\n===在线用户列表===");
                    for (int i = 0; i < users.length; i++) {
                        System.out.println("用户: " + users[i]);
                    }
                }else if (message.getMesType().equals(MessageType.MESSAGE_TO_ALL)){
                    System.out.println("\n接收到一条消息，发送过来的时间为："+ message.getSendTime());
                    System.out.println(message.getSender()+"对所有在线用户说：" + message.getContent());
                }else if (message.getMesType().equals(MessageType.MESSAGE_COMM_MES)){
                    System.out.println("\n接收到一条消息，发送过来的时间为："+ message.getSendTime());
                    System.out.println(message.getSender()+"对你说：" + message.getContent());
                }else if (message.getMesType().equals(MessageType.MESSAGE_FILE_MES)){
                    System.out.println("\n【"+ message.getSender() + "】给你发了一个文件：" +
                             message.getSrc() );
                    //取出message文件的字节数组，通过文件输出流写入到对应的磁盘
                    FileOutputStream fileOutputStream = new FileOutputStream(message.getTarget());
                    fileOutputStream.write(message.getFileBytes());
                    fileOutputStream.close();
                    System.out.println("文件保存成功！");
                }else {
                    System.out.println("这是其他类型的message,暂时不处理");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public Socket getSocket() {
        return socket;
    }
}
